/**
 * 页面配置接口
 */
export interface PageConfig {
  /** 页面标题 */
  title: string
  /** 页面描述 */
  description?: string
  /** 页面权限 */
  permission?: string
  /** 删除确认时显示的目标名称字段 */
  targetNameField?: string
}

/**
 * 搜索字段配置接口
 */
export interface SearchFieldConfig {
  /** 字段名 */
  prop: string
  /** 字段标签 */
  label: string
  /** 字段类型 */
  type: 'input' | 'select' | 'date' | 'daterange'
  /** 占位符 */
  placeholder?: string
  /** 选项配置（用于select类型） */
  options?: Array<{ label: string; value: string | number }>
  /** 是否可清空 */
  clearable?: boolean
  /** 字段宽度 */
  width?: string
}

/**
 * 表单验证规则接口
 */
export interface FormRule {
  required?: boolean
  message?: string
  trigger?: string | string[]
  min?: number
  max?: number
  type?: string
  validator?: (rule: unknown, value: unknown, callback: (error?: Error) => void) => void
}

/**
 * 表单配置接口
 */
export interface FormConfig {
  /** 表单字段配置 */
  fields: FormFieldConfig[]
  /** 表单验证规则 */
  rules: Record<string, FormRule[]>
  /** 表单标签宽度 */
  labelWidth?: string
  /** 对话框宽度 */
  dialogWidth?: string
  /** 新增对话框标题 */
  addTitle?: string
  /** 编辑对话框标题 */
  editTitle?: string
}

/**
 * 表单字段配置接口
 */
export interface FormFieldConfig {
  /** 字段名 */
  prop: string
  /** 字段标签 */
  label: string
  /** 字段类型 */
  type: 'input' | 'textarea' | 'select' | 'upload' | 'date' | 'number'
  /** 占位符 */
  placeholder?: string
  /** 是否必填 */
  required?: boolean
  /** 最大长度 */
  maxlength?: number
  /** 是否显示字数统计 */
  showWordLimit?: boolean
  /** 上传配置（用于upload类型） */
  uploadConfig?: {
    action: string
    name: string
    data?: Record<string, unknown>
    accept?: string
    maxSize?: number
    tips?: string[]
  }
  /** 选项配置（用于select类型） */
  options?: Array<{ label: string; value: string | number }>
}

/**
 * 操作按钮配置接口
 */
export interface ActionConfig {
  /** 新增按钮配置 */
  add?: {
    text: string
    icon?: string
    permission?: string
  }
  /** 批量删除按钮配置 */
  batchDelete?: {
    text: string
    icon?: string
    permission?: string
  }
  /** 导出按钮配置 */
  export?: {
    text: string
    icon?: string
    permission?: string
  }
}

/**
 * 分页配置接口
 */
export interface PaginationConfig {
  /** 每页显示条数选项 */
  pageSizes: number[]
  /** 默认每页显示条数 */
  defaultPageSize: number
}

export interface DataRecord<T = { [key: string]: unknown }> {
  /** 记录的唯一标识符 */
  id?: number | string
  /** 记录的具体数据字段 */
  data: T
  /** 记录创建时间 */
  createdAt?: string | Date
  /** 记录更新时间 */
  updatedAt?: string | Date
  /** 记录状态（如：active, inactive, deleted等） */
  status?: string
}

export interface ResData<T> {
  code: number
  message: string
  data: T
}

export interface Pagination {
  currentPage: number
  pageSize: number
  total: number
}

/**
 * 通用表单数据接口
 * @template T 表单字段的类型，可以是任意对象类型
 * @description 用于定义表单数据的基础结构，支持泛型以适应不同的表单字段类型
 */
export interface FormData<T = { [key: string]: unknown }> {
  /** 表单的具体字段数据 */
  fields: T
  /** 表单验证状态 */
  isValid?: boolean
  /** 表单是否已修改 */
  isDirty?: boolean
  /** 表单错误信息 */
  errors?: Partial<{ [K in keyof T]: string }>
}

/**
 * 通用数据记录接口
 * @template T 记录数据的类型，继承自FormData的fields类型
 * @description 用于定义带有唯一标识符的数据记录，适用于CRUD操作
 */
export interface DataRecord<T = { [key: string]: unknown }> {
  /** 记录的唯一标识符 */
  id?: number | string
  /** 记录的具体数据字段 */
  data: T
  /** 记录创建时间 */
  createdAt?: string | Date
  /** 记录更新时间 */
  updatedAt?: string | Date
  /** 记录状态（如：active, inactive, deleted等） */
  status?: string
}

/**
 * 基础实体接口（保持向后兼容）
 * @template T 实体数据的类型
 * @description 简化版的数据记录接口，主要用于向后兼容
 * @deprecated 建议使用 DataRecord<T> 替代
 */
export type DataRecordAlias<T> = FormData<T> & {
  id?: string
}

/**
 * 通用CRUD列表接口
 * @template T 列表项的数据类型
 * @description 用于定义CRUD操作中的列表数据结构，支持分页和搜索功能
 */
export interface CrudList<T = { [key: string]: unknown }> {
  /** 数据记录列表 */
  records: DataRecord<T>[]
  /** 是否包含搜索计数 */
  searchCount: boolean
  /** 当前页码 */
  current: number
  /** 每页大小 */
  size: number
  /** 总记录数 */
  total: number
}

/**
 * CRUD列表响应数据类型
 * @template T 列表项的数据类型
 */
export type ResCrudList<T = { [key: string]: unknown }> = ResData<CrudList<T>>

/**
 * 表格操作按钮类型
 */
export type ActionButtonType = 'primary' | 'success' | 'warning' | 'danger' | 'info' | 'text'

/**
 * 表格操作按钮大小
 */
export type ActionButtonSize = 'large' | 'default' | 'small'

/**
 * 表格操作按钮配置接口
 * @template T 行数据的类型
 */
export interface TableActionButton<T = { [key: string]: unknown }> {
  /** 按钮文本 */
  text: string
  /** 按钮标签（用于无障碍访问） */
  label?: string
  /** 按钮类型 */
  type?: ActionButtonType
  /** 按钮大小 */
  size?: ActionButtonSize
  /** 是否为朴素按钮 */
  plain?: boolean
  /** 是否为圆角按钮 */
  round?: boolean
  /** 是否为圆形按钮 */
  circle?: boolean
  /** 是否禁用 */
  disabled?: boolean | ((row: T) => boolean)
  /** 是否显示 */
  visible?: boolean | ((row: T) => boolean)
  /** 按钮图标 */
  icon?: string
  /** 点击事件处理函数 */
  handler: (row: T, index?: number) => void | Promise<void>
  /** 权限控制 */
  permission?: string | string[]
  /** 确认提示配置 */
  confirm?: {
    /** 确认提示文本 */
    message: string
    /** 确认提示标题 */
    title?: string
    /** 确认按钮文本 */
    confirmButtonText?: string
    /** 取消按钮文本 */
    cancelButtonText?: string
  }
}

/**
 * 表格列配置接口
 * @template T 行数据的类型
 */
export interface TableColumn<T = { [key: string]: unknown }> {
  /** 列类型 */
  type?: 'selection' | 'index' | 'expand' | 'actions' | 'image' | 'date' | 'tag' | 'switch'
  /** 列属性名 */
  prop?: keyof T | string
  /** 列标题 */
  label: string
  /** 列宽度 */
  width?: number | string
  /** 最小列宽度 */
  minWidth?: number | string
  /** 对齐方式 */
  align?: 'left' | 'center' | 'right'
  /** 是否固定列 */
  fixed?: boolean | 'left' | 'right'
  /** 是否可排序 */
  sortable?: boolean
  /** 是否显示 */
  visible?: boolean
  /** 操作按钮配置（当type为actions时使用） */
  actions?: TableActionButton<T>[]
  /** 图片配置（当type为image时使用） */
  imageConfig?: {
    width?: number
    height?: number
    round?: boolean
    preview?: boolean
    showPlaceholderText?: boolean
  }
  /** 日期配置（当type为date时使用） */
  dateConfig?: {
    format?: string
  }
  /** 标签配置（当type为tag时使用） */
  tagConfig?: {
    colorMap?: { [key: string]: string }
  }
  /** 开关配置（当type为switch时使用） */
  switchConfig?: {
    activeValue?: unknown
    inactiveValue?: unknown
    onChange?: (value: unknown, row: T) => void
  }
}

/**
 * 品牌数据接口
 * @deprecated 建议使用 DataRecord<{ tmName: string; logoUrl: string; createdAt?: string; updatedAt?: string }> 替代
 * @description 此接口保留用于向后兼容，新代码应使用通用的 DataRecord 类型
 */
export interface TrademarkData {
  /** 品牌ID */
  id?: string
  /** 品牌名称 */
  tmName: string
  /** 品牌Logo URL */
  logoUrl: string
  /** 创建时间 */
  createdAt?: string
  /** 更新时间 */
  updatedAt?: string
}
